package com.cskaoyan.javase.oop2._1extends._3advantage;

/**
 * 这里给出一个继承语法的练习案例，通过案例我们来分析一下继承的优缺点：
 * 练习：
 * 在一款游戏中，我们设计了三种类型的鸭子，这些鸭子有一些共同的属性，也有共同的行为，比如都可以叫，都会游泳等。
 * 编写程序，描述这些鸭子。
 * 后来，需求更改了，这些鸭子不能游泳了，但是都会飞，怎么改呢？
 * 再后来，需求又改了，新增了一种鸭子，但这个鸭子不会飞，又怎么办呢？
 *
 * 继承的优点：
 * 1.继承的出现减少了代码冗余，提高了代码的复用性。
 * 2.继承的出现，更有利于功能的扩展，提升了程序的可维护性，更好地应对需求变更。
 *
 * 扩展一点：
 * 继承的出现，对于Java的引用类型而言，弱化了类型的约束力，引用数据类型出现了数据类型转换的概念。
 * 这其实是Java实现面向对象第三个特征——多态的前提。
 *
 * 继承的缺点:
 * 子类会受父类限制
 * 父类的每一个修改都会严格的体现到每一个子类中
 * 子类没得选择
 *
 * 当然这种问题,是可以弥补的,因为子类在继承父类成员方法时
 * 可以修改父类方法实现
 * 称之为"方法的重写"/"方法的覆盖"(override)
 * 但是重写归重写,肯定还是要继承的
 *
 * @since 15:48
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        SecondTypeDuck st = new SecondTypeDuck();
        st.eat();

        ThirdTypeDuck tyd = new ThirdTypeDuck();
        tyd.study();

        ForthTypeDuck ftd = new ForthTypeDuck();
        ftd.fly();

    }
}

// 鸭子父类
class DuckFather {
    String name;

    public void shout() {
        System.out.println("嘎嘎嘎!");
    }

    /*public void swim() {
        System.out.println("白毛浮绿水,红掌拨清波");
    }*/

    public void fly(){
        System.out.println("我要飞到天边!");
    }
}

class FirstTypeDuck extends DuckFather {
    int age;
}

class SecondTypeDuck extends DuckFather {
    public void eat() {
        System.out.println("吃🐠!");
    }
}

class ThirdTypeDuck extends DuckFather {
    public void study() {
        System.out.println("学习鸭!");
    }
}
class ForthTypeDuck extends DuckFather{
    @Override
    public void fly() {
        System.out.println("我很特殊,产品经理不让我飞!");
    }
}